/* eslint no-console: 0, new-cap: 0, camelcase: 0 */
const g = require('gulp');
const $ = require('gulp-load-plugins')();
const webpack = require('webpack-stream');
const combine = require('stream-combiner');
const u = require('./gulp.util');
const cfg = require('./config');

/////////////////////////////////////////////////////////////////////
// 前端编译

g.task('less', () => combine(
    g.src(u.dir(cfg.src.css.dir, '.less')),
    $.less(),
    $.filter(cfg.src.css.main),
    $.rename(cfg.bin.css.main),
    g.dest(cfg.bin.web.dir)
    ).on('error', console.error.bind(console))
);

function packs(config, watch) {
    return combine(
        g.src(cfg.src.web.entry),
        webpack(Object.assign({watch}, require(config))),
        g.dest(cfg.bin.web.dir)
    );
}

g.task('webpack', () => packs('./webpack.config'));
g.task('webpack.debug', ['check.web'], () => packs('./webpack.debug', true));
g.task('web', () => packs('./webpack.debug')); // debug时偶尔会没响应或不起作用

/////////////////////////////////////////////////////////////////////
// 后端编译

const babel_option = {
    presets: ['es2015']
};

g.task('build', () =>
    u.src(u.dir([cfg.src.app.dir], '.js'), {base: cfg.src.dir})
        .pipe($.babel(babel_option))
        .pipe(g.dest(cfg.bin.dir))
);

const cache = new $.cacheModified();

g.task('build.debug', ['check.app', 'check.etc'], () =>
    u.src(u.dir([cfg.src.app.dir], '.js'), {base: cfg.src.dir})
        .pipe(cache.updateSource())
        .pipe($.sourcemaps.init())
        .pipe($.babel(babel_option))
        .pipe(cache.updateProcessed())
        .pipe($.sourcemaps.write('.'))
        .pipe(g.dest(cfg.bin.dir))
);

/////////////////////////////////////////////////////////////////////
// 调试运行

g.task('debug', ['build.debug'], () => $.nodemon({
    env: {NODE_ENV: 'development'},
    watch: [
        cfg.src.app.dir
    ],
    tasks: 'build.debug',
    script: `${cfg.bin.dir}/${cfg.main}`,
    nodeArgs: ['--debug'],
    args: cfg.args
}));

g.task('watch', () => {
    g.watch(cfg.src.dir + '/*.*', ['copy.bin']);
    g.watch(u.dir(cfg.src.etc.dir), ['copy.etc']);
    g.watch(u.dir(cfg.src.res.dir), ['copy.res']);
    g.watch(u.dir(cfg.src.css.dir, '.less'), ['less']);
});
